/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client.dm;

import java.awt.Image;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;


public class Escucha extends Thread{
    
    private String request;
    private DataInputStream in;
    private DataOutputStream out;
    private Conexion servidor;
    private windowTablero wt;
    private List<Integer[]> fichas;
    private Integer[] fichaInicial;
    private String nombreJ;
    private GUI gui;
    
    public Escucha (Conexion servidorS, windowTablero wtS, GUI g) 
    {
        servidorS.Conectar();// conectar al servidor
        wt = wtS;
        servidor = servidorS;
        in = servidorS.getEntrada();
        out = servidor.getSalida();
	fichas = new ArrayList<Integer[]>();
        fichaInicial = new Integer [2];
        nombreJ = wt.getNombreJugador();
        gui = g;
    }
    
    public void parseMsg()
    {
            fichas = new ArrayList<Integer[]>();
            if(!request.equals(null))
            {
                String [] arrayAux= request.split("_");//   addplayer_Amaya
		String command = "", secCommand = "", terCommand = "";
		if(arrayAux[0]!= null){
			command = arrayAux[0];
		}
                if(arrayAux.length>1){
			secCommand = arrayAux[1];
		}
                if(arrayAux.length>2){
			terCommand = arrayAux[2];
		}
		
		if(command.equals("player")){//nombre y posición del jugador
                    System.out.println("recibe nombre y numero");
                    this.wt.setNumJugador(Integer.valueOf(terCommand));
                    this.wt.getNombres()[wt.getNumJugador()] = secCommand;
                    this.wt.setMarcadorTren(Integer.valueOf(terCommand), 1);
                    this.wt.setMarcadorTren(0, 1);
                    
		}else if(command.equals("players")){//nombres y posicion de jugadores
                    System.out.println("recibe jugadores");
                    int i = 1; 
                    do
                    {
                        this.wt.getNombres()[Integer.valueOf(arrayAux[i+1])] = arrayAux[i]; 
                        i = i +2;
                    }while(i<arrayAux.length);
			
		}else if(command.equals("tiles")){ // fichas del jugador
                    objCreateAppletImage createImage = new objCreateAppletImage();
                    if(wt.getFichasUsuario1().size()==0)
                    {
                        System.out.println("recibe fichas");
                        int i;
                        String tupla,numero;
                        StringTokenizer elementos,subelementos;
                        elementos = new StringTokenizer(terCommand,"[]");
                        while(elementos.hasMoreTokens())
                        {
                          Integer [] ficha = new Integer [2];
                          tupla = elementos.nextToken();
                          i=0;
                          subelementos = new StringTokenizer(tupla,",");
                          while(subelementos.hasMoreTokens())
                          {
                            numero = subelementos.nextToken();
                            ficha[i] = Integer.valueOf(numero);
                            //System.out.println(i+". "+numero);
                            i++;
                          }
                          fichas.add(ficha);                    
                        }

                        this.wt.setFichasUsuarioTuplas(fichas);
                        for(int j = 0; j<fichas.size(); j++)
                        {
                            Image im = setFichas(fichas.get(j)[0], fichas.get(j)[1]);
                            wt.getFichasUsuario1().add(im);//llenar imagenes
                        }
                     }
                    
		}else if(command.equals("tile")){ // ficha inicial
                    int i;
                    String tupla,numero;
                    StringTokenizer elementos,subelementos;
                    elementos = new StringTokenizer(secCommand,"[]");
                    while(elementos.hasMoreTokens())
                    {
                      tupla = elementos.nextToken();
                      i=0;
                      subelementos = new StringTokenizer(tupla,",");
                      while(subelementos.hasMoreTokens())
                      {
                        numero = subelementos.nextToken();
                        fichaInicial[i] = Integer.valueOf(numero);
                        //System.out.println(i+". "+numero);
                        i++;
                      }
                    }
                    
                    this.wt.setFichaInicialT(fichaInicial);
                    wt.setEnabled(true);
                    wt.setVisible(true);
                    wt.setFichaInicial1(setFichas(fichaInicial[0], fichaInicial[1]));
                    wt.setupImages(wt.getFichasUsuario1(), wt.getFichaInicial1(), wt.getFichasUsuarioTuplas(), wt.getFichaInicialT());
                    
                    gui.getNuevoJuego().setVisible(true);
		}
                else if(command.equals("ask")){ // agregar la ficha q se pidio
                    int i;
                    String tupla,numero;
                    StringTokenizer elementos,subelementos;
                    elementos = new StringTokenizer(secCommand,"[]");
                    Integer[] fNueva = new Integer[2];
                    while(elementos.hasMoreTokens())
                    {
                      tupla = elementos.nextToken();
                      i=0;
                      subelementos = new StringTokenizer(tupla,",");
                      while(subelementos.hasMoreTokens())
                      {
                        numero = subelementos.nextToken();
                        fNueva[i] = Integer.valueOf(numero);
                        //System.out.println(i+". "+numero);
                        i++;
                      }
                    }
                    
                    wt.getFichasUsuario1().add(setFichas(fNueva[0],fNueva[1]));
                    wt.repaint();
			
		}
                else if(command.equals("openline")){// tren abierto                    
                    wt.setMarcadorTren(Integer.valueOf(secCommand), 1);
                    // cambiar el color del nombre
                    wt.cambiarColor(Integer.valueOf(secCommand));
		}else if(command.equals("closeline")){// tren abierto
                    wt.setMarcadorTren(Integer.valueOf(secCommand), 0);
                    // cambiar el color del nombre
                    wt.cambiarColor(Integer.valueOf(secCommand));
		}
                else if(command.equals("empty")){// No hay fichas disponibles
                    wt.setStrStatusMsg("No hay fichas disponibles");
                    wt.repaint();
		}else if (command.equals("moveok")){
                    //"move_line#_[a,b]"
			this.wt.moverFicha();                    
		}else if (command.equals("moveturn")){//otro turno
                    //"move_line#_[a,b]"
			this.wt.setStrStatusMsg("Es el turno de otro jugador");                    
                        wt.repaint();
		}else if(command.equals("movewrong"))
                {//devolver ficha
                    this.wt.unsucessfullDrag();
                    wt.repaint();
                }else if(command.equals("moveagain"))
                {// ficha doble
                    this.wt.moverFicha();                    
                    wt.setAgain(true);
                    wt.setStrStatusMsg(wt.getPlayerMsg());
                    wt.repaint();	
                }else if (command.equals("movegamer")){
                    //movegamer_#_[a,b]
                    String tupla,numero;
                    StringTokenizer elementos,subelementos;
                    elementos = new StringTokenizer(terCommand,"[]");
                    Integer[] fNueva = new Integer[2];
                    while(elementos.hasMoreTokens())
                    {
                      tupla = elementos.nextToken();
                      int i=0;
                      subelementos = new StringTokenizer(tupla,",");
                      while(subelementos.hasMoreTokens())
                      {
                        numero = subelementos.nextToken();
                        fNueva[i] = Integer.valueOf(numero);
                        //System.out.println(i+". "+numero);
                        i++;
                      }
                    }
                    wt.moverFichaJugador(Integer.valueOf(secCommand),setFichas(fNueva[0],fNueva[1])); 
                    wt.setStrStatusMsg("Escoge una ficha para jugar");
                    wt.repaint();	
		}
                else if (command.equals("gameover")){
                    if(secCommand.contains(wt.getNombres()[wt.getNumJugador()]))
                    {   wt.setHasWon(true);
                        wt.setStrStatusMsg(wt.getPlayerMsg());
                        wt.repaint();
                        wt.terminar(secCommand);
                    }
		}else{
			
			System.out.println("Command not understood");
		}
            }
	}
    
    public Image setFichas(int num1, int num2)
    {  
            String imagen = "";    
            objCreateAppletImage createImage = new objCreateAppletImage();
            Image image = createImage.getImage(this, "resources/nada.gif", 5000);
            while (imagen.equals(""))
            {
                switch (num1)
                {
                     case 0:
                        switch (num2)
                        {
                            case 0:
                                imagen ="00";
                                break;                                        
                        }
                        break;
                    case 1:
                        switch (num2)
                        {
                            case 0:
                                imagen ="10";
                                break;
                            case 1:
                                imagen ="11";
                                break;                                       
                        }
                        break;
                    case 2:
                        switch (num2)
                        {
                            case 0:
                                imagen ="20";
                                break;
                            case 1:
                                imagen ="21";
                                break;
                            case 2:
                                imagen ="22";
                                break;                                        
                        }
                        break;
                    case 3:
                        switch (num2)
                        {
                            case 0:
                                imagen ="30";
                                break;
                            case 1:
                                imagen ="31";
                                break;
                            case 2:
                                imagen ="32";
                                break; 
                            case 3:
                                imagen ="33";
                                break;                                       
                        }
                        break;
                    case 4:
                        switch (num2)
                        {
                            case 0:
                                imagen ="40";
                                break;
                            case 1:
                                imagen ="41";
                                break;
                            case 2:
                                imagen ="42";
                                break; 
                            case 3:
                                imagen ="43";
                                break; 
                            case 4:
                                imagen ="44";
                                break;                                     
                        }
                        break;
                    case 5:
                        switch (num2)
                        {
                            case 0:
                                imagen ="50";
                                break;
                            case 1:
                                imagen ="51";
                                break;
                            case 2:
                                imagen ="52";
                                break; 
                            case 3:
                                imagen ="53";
                                break; 
                            case 4:
                                imagen ="54";
                                break; 
                            case 5:
                                imagen ="55";
                                break;                                        
                        }
                        break;
                    case 6:
                        switch (num2)
                        {
                            case 0:
                                imagen ="60";
                                break;
                            case 1:
                                imagen ="61";
                                break;
                            case 2:
                                imagen ="62";
                                break; 
                            case 3:
                                imagen ="63";
                                break; 
                            case 4:
                                imagen ="64";
                                break; 
                            case 5:
                                imagen ="65";
                                break;  
                            case 6:
                                imagen ="66";
                                break;   
                        }
                        break;
                    case 7:
                        switch (num2)
                        {
                            case 0:
                                imagen ="70";
                                break;
                            case 1:
                                imagen ="71";
                                break;
                            case 2:
                                imagen ="72";
                                break; 
                            case 3:
                                imagen ="73";
                                break; 
                            case 4:
                                imagen ="74";
                                break; 
                            case 5:
                                imagen ="75";
                                break;
                            case 6:
                                imagen ="76";
                                break;
                            case 7:
                                imagen ="77";
                                break;  
                        }
                        break;
                    case 8:
                        switch (num2)
                        {
                            case 0:
                                imagen ="80";
                                break; 
                            case 1:
                                imagen ="81";
                                break;
                            case 2:
                                imagen ="82";
                                break;
                            case 3:
                                imagen ="83";
                                break;
                            case 4:
                                imagen ="84";
                                break;    
                            case 5:
                                imagen ="85";
                                break;
                            case 6:
                                imagen ="86";
                                break;
                            case 7:
                                imagen ="87";
                                break;
                            case 8:
                                imagen ="88";
                                break; 
                        }
                        break; 
                    case 9:
                        switch (num2)
                        {
                            case 0:
                                imagen ="90";
                                break;
                            case 1:
                                imagen ="91";
                                break;
                            case 2:
                                imagen ="92";
                                break;
                            case 3:
                                imagen ="93";
                                break;
                            case 4:
                                imagen ="94";
                                break;
                            case 5:
                                imagen ="95";
                                break;
                            case 6:
                                imagen ="96";
                                break;
                            case 7:
                                imagen ="97";
                                break;
                            case 8:
                                imagen ="98";
                                break; 
                            case 9:
                                imagen ="99";
                                break;
                        }
                        break;
                    case 10:
                        switch (num2)
                        {
                            case 0:
                                imagen ="100";
                                break;
                            case 1:
                                imagen ="101";
                                break;
                            case 2:
                                imagen ="102";
                                break; 
                            case 3:
                                imagen ="103";
                                break;
                            case 4:
                                imagen ="104";
                                break;
                            case 5:
                                imagen ="105";
                                break;
                            case 6:
                                imagen ="106";
                                break;
                            case 7:
                                imagen ="107";
                                break;
                            case 8:
                                imagen ="108";
                                break; 
                            case 9:
                                imagen ="109";
                                break;
                            case 10:
                                imagen ="1010";
                                break;                                     
                        }
                        break;
                    case 11:
                        switch (num2)
                        {
                            case 0:
                                imagen ="110";
                                break;
                            case 1:
                                imagen ="111";
                                break;
                            case 2:
                                imagen ="112";
                                break;
                            case 3:
                                imagen ="113";
                                break;
                            case 4:
                                imagen ="114";
                                break;
                            case 5:
                                imagen ="115";
                                break;
                            case 6:
                                imagen ="116";
                                break;
                            case 7:
                                imagen ="117";
                                break;
                            case 8:
                                imagen ="118";
                                break; 
                            case 9:
                                imagen ="119";
                                break;
                            case 10:
                                imagen ="1110";
                                break;
                            case 11:
                                imagen ="1111";
                                break;                                      
                        }
                        break;
                    case 12:
                        switch (num2)
                        {
                             case 0:
                                imagen ="00";
                                break;
                            case 1:
                                imagen ="121";
                                break;
                            case 2:
                                imagen ="122";
                                break;
                            case 3:
                                imagen ="123";
                                break;
                            case 4:
                                imagen ="124";
                                break;
                            case 5:
                                imagen ="125";
                                break;
                            case 6:
                                imagen ="126";
                                break;
                            case 7:
                                imagen ="127";
                                break;
                            case 8:
                                imagen ="128";
                                break; 
                            case 9:
                                imagen ="129";
                                break;
                            case 10:
                                imagen ="1210";
                                break;
                            case 11:
                                imagen ="1211";
                                break;
                            case 12:
                                imagen ="1212";
                                break;    
                        }
                        break;    
                }
                
                if(imagen.equals(""))
                {
                    int val = num1;
                    num1 = num2;
                    num2 = val;
                } 
                else
                {
                    image = createImage.getImage(this, "resources/imagenes/" + imagen+".gif", 5000);            
                }
            /*if(i==fichas.size()-1)
            {
                wt.setFichaInicial1(image);
            }    
            else
            {
                wt.getFichasUsuario1().add(image);
                //mt.addImage(fichasUsuario1.get(i), 0);
            }  
             * 
             */
         }
         return image;
    }
    
    public void run(){
        System.out.println("comienza hilo: ");
		try {	
                    msj("addplayer_"+nombreJ); 
                    String data=""; 
			while (true){// This thread will manage this player/client
				data = in.readLine();	 // read a line of data from the stream
				System.out.println("Answering:" + data);
				
				this.request = data;
				parseMsg();
				//parse matrix size and operation
				
			}
			
		}catch (EOFException e){System.out.println("EOF:"+e.getMessage());
		} catch(IOException e) {System.out.println("readline:"+e.getMessage());
		}
	}	
    
    public void msj(String msj)
    {		
        try {
                out.writeUTF(msj);
                out.flush();
        } catch (IOException e) {
                // TODO Auto-generated catch block
                System.out.println("Failed to answer back to player");
                e.printStackTrace();
        }

    }
}
